package com.sz.admin.dtutransportinfo.service.impl;

import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.sz.admin.dtutransportinfo.service.DtuTransportInfoService;
import com.sz.admin.dtutransportinfo.mapper.DtuTransportInfoMapper;
import com.sz.admin.dtutransportinfo.pojo.po.DtuTransportInfo;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.sz.core.common.enums.CommonResponseEnum;
import com.sz.core.util.PageUtils;
import com.sz.core.util.BeanCopyUtils;
import com.sz.core.util.Utils;
import com.sz.core.common.entity.PageResult;
import com.sz.core.common.entity.SelectIdsDTO;
import com.sz.admin.dtutransportinfo.pojo.dto.DtuTransportInfoCreateDTO;
import com.sz.admin.dtutransportinfo.pojo.dto.DtuTransportInfoUpdateDTO;
import com.sz.admin.dtutransportinfo.pojo.dto.DtuTransportInfoListDTO;
import com.sz.admin.dtutransportinfo.pojo.vo.DtuTransportInfoVO;
import com.sz.core.common.entity.ImportExcelDTO;
import com.sz.excel.core.ExcelResult;
import java.io.OutputStream;
import jakarta.servlet.http.HttpServletResponse;
import com.sz.core.util.FileUtils;
import com.sz.excel.utils.ExcelUtils;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import org.springframework.stereotype.Service;
import java.io.Serializable;
import java.util.List;

/**
 * <p>
 * DTU运输信息 服务实现类
 * </p>
 *
 * @author sz-admin
 * @since 2025-10-23
 */
@Service
@RequiredArgsConstructor
public class DtuTransportInfoServiceImpl extends ServiceImpl<DtuTransportInfoMapper, DtuTransportInfo> implements DtuTransportInfoService {
    
    private final DtuTransportInfoMapper dtuTransportInfoMapper;

    @Override
    public void create(DtuTransportInfoCreateDTO dto){
        DtuTransportInfo dtuTransportInfo = BeanCopyUtils.copy(dto, DtuTransportInfo.class);
        save(dtuTransportInfo);
    }

    @Override
    public void update(DtuTransportInfoUpdateDTO dto){
        DtuTransportInfo dtuTransportInfo = BeanCopyUtils.copy(dto, DtuTransportInfo.class);
        saveOrUpdate(dtuTransportInfo);
    }

    @Override
    public PageResult<DtuTransportInfoVO> page(DtuTransportInfoListDTO dto){
        QueryWrapper wrapper = buildQueryWrapper(dto);
        Page<DtuTransportInfoVO> page = super.pageAs(PageUtils.getPage(dto), wrapper, DtuTransportInfoVO.class);
        return PageUtils.getPageResult(page);
    }

    @Override
    public List<DtuTransportInfoVO> list(DtuTransportInfoListDTO dto){
        return super.listAs(buildQueryWrapper(dto), DtuTransportInfoVO.class);
    }

    @Override
    public void remove(SelectIdsDTO dto){
        CommonResponseEnum.INVALID_ID.assertTrue(dto.getIds().isEmpty());
        super.removeByIds(dto.getIds());
    }

    @Override
    public DtuTransportInfoVO detail(Object id){
        DtuTransportInfo dtuTransportInfo = super.getById((Serializable) id);
        CommonResponseEnum.INVALID_ID.assertNull(dtuTransportInfo);
        return BeanCopyUtils.copy(dtuTransportInfo, DtuTransportInfoVO.class);
    }

    @SneakyThrows
    @Override
    public void importExcel(ImportExcelDTO dto) {
        ExcelResult<DtuTransportInfoCreateDTO> excelResult = ExcelUtils.importExcel(dto.getFile().getInputStream(), DtuTransportInfoCreateDTO.class, true);
        List<DtuTransportInfoCreateDTO> list = excelResult.getList();
        List<String> errorList = excelResult.getErrorList();
        String analysis = excelResult.getAnalysis();
        System.out.println(" analysis : " + analysis);
        System.out.println(" isCover : " + dto.getIsCover());
    }

    @SneakyThrows
    @Override
    public void exportExcel(DtuTransportInfoListDTO dto, HttpServletResponse response) {
        List<DtuTransportInfoVO> list = list(dto);
        String fileName = "DTU运输信息表";
        OutputStream os = FileUtils.getOutputStream(response, fileName + ".xlsx");
        ExcelUtils.exportExcel(list, "DTU运输信息表", DtuTransportInfoVO.class, os);
    }

    private static QueryWrapper buildQueryWrapper(DtuTransportInfoListDTO dto) {
        QueryWrapper wrapper = QueryWrapper.create().from(DtuTransportInfo.class);
        if (Utils.isNotNull(dto.getDtuNumber())) {
            wrapper.and(DtuTransportInfo::getDtuNumber).eq(dto.getDtuNumber());
        }
        if (Utils.isNotNull(dto.getSort())) {
            wrapper.and(DtuTransportInfo::getSort).eq(dto.getSort());
        }
        if (Utils.isNotNull(dto.getStartLongitude())) {
            wrapper.and(DtuTransportInfo::getStartLongitude).eq(dto.getStartLongitude());
        }
        if (Utils.isNotNull(dto.getStartLatitude())) {
            wrapper.and(DtuTransportInfo::getStartLatitude).eq(dto.getStartLatitude());
        }
        if (Utils.isNotNull(dto.getEndLongitude())) {
            wrapper.and(DtuTransportInfo::getEndLongitude).eq(dto.getEndLongitude());
        }
        if (Utils.isNotNull(dto.getEndLatitude())) {
            wrapper.and(DtuTransportInfo::getEndLatitude).eq(dto.getEndLatitude());
        }
        if (Utils.isNotNull(dto.getTransportDistance())) {
            wrapper.and(DtuTransportInfo::getTransportDistance).eq(dto.getTransportDistance());
        }
        if (Utils.isNotNull(dto.getUserId())) {
            wrapper.and(DtuTransportInfo::getUserId).eq(dto.getUserId());
        }
        if (Utils.isNotNull(dto.getStartTimeStart()) && Utils.isNotNull(dto.getStartTimeEnd())) {
            wrapper.and(DtuTransportInfo::getStartTime).ge(dto.getStartTimeStart())
                   .and(DtuTransportInfo::getStartTime).le(dto.getStartTimeEnd());
        } else if (Utils.isNotNull(dto.getStartTimeStart())) {
            wrapper.and(DtuTransportInfo::getStartTime).ge(dto.getStartTimeStart());
        } else if (Utils.isNotNull(dto.getStartTimeEnd())) {
            wrapper.and(DtuTransportInfo::getStartTime).le(dto.getStartTimeEnd());
        }
        if (Utils.isNotNull(dto.getEndTimeStart()) && Utils.isNotNull(dto.getEndTimeEnd())) {
            wrapper.and(DtuTransportInfo::getEndTime).ge(dto.getEndTimeStart())
                   .and(DtuTransportInfo::getEndTime).le(dto.getEndTimeEnd());
        } else if (Utils.isNotNull(dto.getEndTimeStart())) {
            wrapper.and(DtuTransportInfo::getEndTime).ge(dto.getEndTimeStart());
        } else if (Utils.isNotNull(dto.getEndTimeEnd())) {
            wrapper.and(DtuTransportInfo::getEndTime).le(dto.getEndTimeEnd());
        }
        return wrapper;
    }
}